//==============================================================================
/**
 * @file	cb_sys.h
 * @brief	簡単な説明を書く
 * @author	goto
 * @date	2006.04.03(月)
 *
 * ここに色々な解説等を書いてもよい
 *
 */
//==============================================================================

#ifndef __CB_SYS_H__
#define __CB_SYS_H__

#include "field/field_common.h"

#include "system/bmp_menu.h"
#include "system/palanm.h"
#include "system/clact_tool.h"
#include "system/touch_subwindow.h"
#include "system/font_arc.h"
#include "system/selbox.h"

#include "include/application/imageClip/imc_hand.h"
#include "include/msgdata/msg.naix"
#include "include/msgdata/msg_ball_custom.h"

#include "touchpanel_system.h"
#include "touchpanel.h"
#include "gflib/button_man.h"
#include "wazaeffect/ball_effect.h"
#include "include/poketool/poke_tool.h"
#include "include/system/fontoam.h"

#include "include/system/softsprite.h"

#include "application/cb_app.h"
#include "seal/seal.h"
#include "cb_def.h"


typedef struct {

	CATS_ACT_PTR	cap[ CB_ENUM_BTN_NUM ];

} TUSUALLY_BTN;

typedef struct {

	int no;			///< 何ページ目か
	int max;		///< 何ページまであるか

	u8	item[ CB_DEF_PAGE_ITEMS ];	///< 現在のアイテム

} TPAGE_DATA;

enum {
	CB_ENUM_FONT_OAM_1 = 0,
	CB_ENUM_FONT_OAM_2,
	CB_ENUM_FONT_OAM_MAX,
};

// -----------------------------------------
//
//	□ メインワーク
//
// -----------------------------------------
///< system
typedef struct {

	int					hold;					///< シールホールド
	BOOL				main_tp_active;			///< メインパネルの操作フラグ

	CATS_SYS_PTR		csp;
	CATS_RES_PTR		crp;

	GF_BGL_INI*			bgl;
	PALETTE_FADE_PTR	pfd;
	GF_BGL_BMPWIN		win[ WIN_MAX ];
	BMP_MENULIST_DATA*	bml;
	BMPMENU_WORK*		bmw;

	SOFT_SPRITE_MANAGER* ssm_p;
	SOFT_SPRITE*		 ssp;
	int					 height;

	IMC_HAND			pen;		///< hand

	BUTTON_MAN*			btn;

	RECT_HIT_TBL		hit_tbl[ CB_DEF_HIT_TBL_MAX ];

	TOUCH_SW_SYS*		tss;
	SELBOX_SYS*			sbox;
	SELBOX_WORK*		list_wk;	///<選択ボックスワーク

	BES_PTR				bes;
	BMS_PTR				bms;

	GF_G3DMAN*			g3Dman;

	/// --- font
	FONTOAM_SYS_PTR		fontoam_sys;
	FONTOAM_OBJ_PTR		font_obj[ CB_ENUM_FONT_OAM_MAX ];
	CHAR_MANAGER_ALLOCDATA	font_vram[ CB_ENUM_FONT_OAM_MAX ];

	BOOL				sub_tcb_active;

	POKE_ANM_SYS_PTR	pas;

	BOOL				bEdit;

} CB_SYS;

///< マークボール
typedef struct {

	int poke_idx;								///< ポケモンに持たせているか
	int edit_flag;								///< 編集済みか
	CATS_ACT_PTR	cap;						///< OBJ

} CB_MARK_OBJ;

///< エディットデータ
typedef struct {

	int	poke_idx;								///< セーブと絡む、持ってるポケモンNO
	CB_CORE*		core;						///< セーブと絡む、コアデータ

} CB_EDIT_DATA;

///< シールデータ
typedef struct {
	BOOL			pop;						///< ポップしたか？

	u8				id;							///< シールID
	u8				x;
	u8				y;

	CATS_ACT_PTR	cap;

	RECT_HIT_TBL*	hit;						///< 当たり判定

} CB_SEAL_ONE;

typedef struct _CB_SEAL_ONE * SEAL_PTR;

///< main
typedef struct {

	CB_PROC_WORK*		cb_pw;					///< 外部からもらうデータ(save)

	CB_EDIT_DATA		cb_edit_data[ CB_DEF_CORE_MAX ];///< 編集中のカスタムボール
	CB_ITEM_DATA*		cb_item_data;			///< 所持シール

	CB_CORE				backup_edit;			///< バックアップ 編集
	u8					backup_item[ CB_DEF_ITEM_DATA_NUM ];

	CB_SYS	sys;								///< システム

	CB_MARK_OBJ			mo[ CB_DEF_CORE_MAX ];	///< マークOBJ
	CATS_ACT_PTR		cap_cur[2];
	CATS_ACT_PTR		icon[ TEMOTI_POKEMAX ];	///< 手持ちポケモンアイコン
	CATS_ACT_PTR		piko[ 4 ];

	CB_SEAL_ONE			seal[ CB_DEF_SEAL_MAX ];///< シール
	int					seal_pri[ CB_DEF_SEAL_MAX ];

	int	select[2];								///< 選択中ボール

	int mode;									///< 画面のモード
	int next_mode;								///< 次のモード
	int seq;									///< 画面内でのシーケンス
	int keep_seq;								///< 保存するシーケンス
	int sub_seq;								///< サブシーケンス
	int sub_work;
	int key_mode;								///<key or touch
	int msg_wait;

	TUSUALLY_BTN		button_obj;				///< 通常配置されているボタン
	TPAGE_DATA			page;					///< ページ状態

	POKEMON_PARAM*		test_pp;

	ARCHANDLE*			handle;

} CB_MAIN_WORK;

///< メニュー
typedef struct {

	int	msg_id;
	u32 param;

} TCB_MENU_PARAM;

#include "cb_tool.h"

extern const TCB_MENU_PARAM CB_ParamTable[ CB_DEF_MENU_MAX ];

typedef int (*pCB_Menu_Func)(CB_MAIN_WORK* cbmw);


extern u8 CBProc_SelectPosGet(CB_PROC_WORK* pw);
extern void CBProc_SelectPosSet(CB_PROC_WORK* pw, u8 pos);
extern POKEMON_PARAM* CBProc_PokeParaGet(CB_PROC_WORK* pw, int no);
extern u8 CBProc_SelectPosGet(CB_PROC_WORK* pw);
extern void CBProc_SelectPosSet(CB_PROC_WORK* pw, u8 pos);
extern u8 CBProc_NextModeGet(CB_PROC_WORK* pw);

///< cb_main.c
extern BOOL CustomMain_Executed(CB_MAIN_WORK* cbmw);
extern void CB_Tool_ButtonInit(CB_MAIN_WORK* cbmw);

// font oam
extern void FontOam_SysInit(CB_MAIN_WORK* cbmw);
extern void FontOam_SysDelete(CB_MAIN_WORK* cbmw);
extern void FontOam_ResourceLoad(CB_MAIN_WORK* cbmw);
extern void FontOam_Add(CB_MAIN_WORK* cbmw);
extern void FontOam_Enable(CB_MAIN_WORK* cbmw, BOOL flag);
extern void FontOam_Create(CB_MAIN_WORK* cbmw, int no, int x, int y, int pal_offset);

extern void CB_ButtonCallBack( u32 button, u32 event, void* work );
/**
 *	@brief	ブロックの次のシーケンスを設定
 */
extern void CBProc_NextModeSet(CB_PROC_WORK* pw, u8 mode);

///< cb_seal.c
extern void HitTable_CreateCap(RECT_HIT_TBL* tbl, CATS_ACT_PTR cap, BOOL tp_set);

extern void CBS_ResLoad(CB_MAIN_WORK* cbmw, u8 one_id, u8 id);
extern void CBS_LoadInit(CB_MAIN_WORK* cbmw);
extern int	CBS_SearchPop(CB_MAIN_WORK* cbmw, u8 id);
extern BOOL CBS_IsPop(CB_MAIN_WORK* cbmw);
extern BOOL CBS_Add(CB_MAIN_WORK* cbmw, u8 id);
extern void CBS_PriSetTop(CB_MAIN_WORK* cbmw, u8 id);
extern BOOL CBS_SealHold(CB_MAIN_WORK* cbmw, u32 event, u8 id);
extern void CBS_Delete(CB_MAIN_WORK* cbmw);
extern void CBS_Enable(CB_MAIN_WORK* cbmw, int flag);

extern BOOL CBS_ReleasePointCheck(CB_MAIN_WORK* cbmw, int id);
extern void CBS_Release(CB_MAIN_WORK* cbmw, int id);
extern void CBS_ReleasePointCheckTypeSet(CB_MAIN_WORK* cbmw, int id);

extern int  CBS_PtoP(s16 x1, s16 y1, s16 x2, s16 y2);

extern BOOL CBS_CheckEditData(CB_MAIN_WORK* cbmw);
extern void CBS_OldEditDataSet(CB_MAIN_WORK* cbmw);
extern void CBS_EditDataRefrect(CB_MAIN_WORK* cbmw, int id);
extern void CBS_EditData_Save(CB_MAIN_WORK* cbmw);
extern void CBS_TestCoreData_Create(CB_CORE* core, CB_MAIN_WORK* cbmw);

extern void CBS_Pri_HitTbl_Sort(CB_MAIN_WORK* cbmw);

extern void CBS_Seal_ViewPosSet(CB_MAIN_WORK* cbmw);
extern void CBS_Seal_EditPosSet(CB_MAIN_WORK* cbmw);


extern int CBS_PublicTool_RangeGet(CB_SEAL* seal);
extern int CBS_PublicTool_RangeWaitGet(CB_SEAL* seal);


///< cb_disp.c
/**
 *	@brief	コモンBmpWindow追加
 */
extern void CBDisp_ComWinAdd(CB_MAIN_WORK* cbmw);
/*
 *	@brief	コモンBmpWindow削除
 */
extern void CBDisp_ComWinDel(CB_MAIN_WORK* cbmw);
/**
 *	@brief	メイン画面ボタンウィンドウ表示
 */
extern void CBDisp_MainBtnSet(CB_MAIN_WORK* cbmw,BOOL on);



extern void CB_BMP_SelectWinAdd(GF_BGL_INI* bgl, GF_BGL_BMPWIN* win, int frm, CB_MAIN_WORK* cbmw, int no);
extern void CB_BMP_SelectWinDel(CB_MAIN_WORK* cbmw);
extern void CB_SelectThisPosGet(int pos, s16* x, s16* y);
extern void CB_Tool_PokeIcon_Load(CB_MAIN_WORK* cbmw);
extern void CB_Tool_PokeIcon_Add(CB_MAIN_WORK* cbmw);
extern void CB_Tool_PokeIcon_CheckPosSetup(CB_MAIN_WORK* cbmw);
extern void CB_Tool_PokeIcon_Update(CB_MAIN_WORK* cbmw);
extern void CB_Tool_PokeIcon_Del(CB_MAIN_WORK* cbmw);
extern void CB_Tool_MarkObj_SetUp(CB_MAIN_WORK* cbmw);
extern void CB_Tool_CatsInit(CB_SYS* sys);
extern void CB_Tool_CatsDelete(CB_SYS* sys);
extern void SubObj_ResLoad(CATS_SYS_PTR csp, CATS_RES_PTR crp, PALETTE_FADE_PTR pfd, int chr_id, int pal_id, int cel_id, int cla_id, int vram, int pal_tg, int palnum,ARCHANDLE* p_handle);
extern void CB_Tool_SubSelect_ObjAdd(CB_MAIN_WORK* cbmw, ARCHANDLE* p_handle);
extern void SubSelect_ObjRefrect(CB_MAIN_WORK* cbmw);
extern void CB_Tool_CoreDataChange(CB_MAIN_WORK* cbmw, int from, int to);
extern void SubSelect_ObjUpdate(CB_MAIN_WORK* cbmw);
extern void SubSelect_ObjDelete(CB_MAIN_WORK* cbmw);
extern void CB_BMP_WindowResLoad(GF_BGL_INI* bgl, PALETTE_FADE_PTR pfd, int wintype);
extern void CB_BMP_WindowResLoad_Sub(GF_BGL_INI* bgl, PALETTE_FADE_PTR pfd, int wintype);
extern void CB_BMP_InfoMessageSet(GF_BGL_BMPWIN * win, int win_index, int mes_id,BOOL win_on);
extern void CB_BMP_WindowAdd(GF_BGL_INI* bgl, GF_BGL_BMPWIN* win, int frm, int x, int y, int sx, int sy, int ofs);
extern void CB_BMP_WindowAddSimple(GF_BGL_INI* bgl, GF_BGL_BMPWIN* win, int frm, int x, int y, int sx, int sy, int ofs);
extern void CB_BMP_SealNumWinAdd(CB_MAIN_WORK* cbmw);
extern void CB_BMP_SealNumWinPrint(CB_MAIN_WORK* cbmw);
extern void CB_BMP_SealNumWinPrint_No(CB_MAIN_WORK* cbmw, int no);
extern void CB_BMP_SealNumWinDel(CB_MAIN_WORK* cbmw);
extern void CB_BMP_SealNameSet(GF_BGL_BMPWIN * win, int id);
extern void CB_DispOn(void);
extern void CB_WipeFadeIn(void);
extern void CB_WipeFadeOut(void);
extern void CB_Select_TopResLoad(CB_MAIN_WORK* cbmw, ARCHANDLE* p_handle);
extern void CB_Select_BottomResLoad(CB_MAIN_WORK* cbmw, ARCHANDLE* p_handle);
extern void CB_Edit_BottomResLoad(CB_MAIN_WORK* cbmw, ARCHANDLE* p_handle);
extern void CB_Tool_SealBTN_ResLoad(CB_MAIN_WORK* cbmw);
extern void CB_Tool_BTN_ResLoad(CB_MAIN_WORK* cbmw, ARCHANDLE* p_handle);
extern void CB_Tool_BTN_Add(CB_MAIN_WORK* cbmw);
extern void CB_Tool_BTN_Enable(CB_MAIN_WORK* cbmw, int flag);
extern void CB_Tool_BTN_Update(CB_MAIN_WORK* cbmw);
extern void CB_Tool_BTN_Delete(CB_MAIN_WORK* cbmw);
extern void CB_Particle_Init(void);
extern void CB_Particle_Main(void);

extern void PageData_Create(CB_MAIN_WORK* cbmw, int page_no);
extern void PageData_ResourceLoad(CB_MAIN_WORK* cbmw);
extern void PageData_Add(CB_MAIN_WORK* cbmw);
extern void PageData_Del(CB_MAIN_WORK* cbmw);

extern void CB_View_Scroll(CB_MAIN_WORK* cbmw, s8 r_vec, int wait);
extern void CB_View_ScrollSet(CB_MAIN_WORK* cbmw, s8 r_vec);


extern void Piko_ResLoad(CB_MAIN_WORK* cbmw, ARCHANDLE* p_handle);
extern void Piko_Add(CB_MAIN_WORK* cbmw);
extern void Piko_Delete(CB_MAIN_WORK* cbmw);
extern void Piko_Update(CB_MAIN_WORK* cbmw);
extern void Piko_Enable(CB_MAIN_WORK* cbmw, int flag);


extern void			CBSimpleSetUp(void);
extern GF_G3DMAN*	CB_3D_Init(void);

extern void CBS_SVSort(CB_MAIN_WORK* cbmw);

#endif
